package com.jxt.myjxtmanager.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * 列表数据适配器抽象基类
 * 
 * @author lkk
 * 
 * @param <T>
 *            列表数据的类型
 */
public abstract class BaseListAdapter<T> extends BaseAdapter {
	String TAG = BaseListAdapter.class.getSimpleName();
	/**
	 * 上下文
	 */
	protected Context mContext;
	/**
	 * 列表数据
	 */
	protected List<T> mDatas = new ArrayList<T>();
	/**
	 * 默认构造
	 * 
	 * @param context
	 *            上下文对象
	 * @param datas
	 *            列表数据
	 */
	public BaseListAdapter(Context context, List<T> datas) {
		this.mContext = context;
		this.mDatas = datas;
	}

	@Override
	public int getCount() {
		return mDatas == null ? 0 : mDatas.size();
	}

	@Override
	public Object getItem(int position) {
		return mDatas == null ? null : mDatas.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			convertView = LayoutInflater.from(mContext).inflate(getLayoutId(),
					null);
		}
		getIView(position, convertView, parent);
		return convertView;
	}
	/**
	 * 每一个列表项的视图
	 * 
	 * @param position
	 *            数据索引位置
	 * @param convertView
	 *            可服用的视图
	 * @param parent
	 *            列表项所属父元素
	 * @return 返回列表项视图
	 */
	public abstract View getIView(int position, View convertView,
			ViewGroup parent);
	/**
	 * 列表项视图的布局资源
	 * 
	 * @return 返回列表项的布局资源layoutID
	 */
	public abstract int getLayoutId();
	/**
	 * 追加数据
	 * 
	 * @param datas
	 *            要追加到列表的数据,追加之后,会自动通知列表刷新
	 */
	synchronized public void appendDataList(List<T> datas) {
		if (mDatas != null && datas != null) {
			mDatas.addAll(datas);
			notifyDataSetChanged();
		}
	}
	/**
	 * 清除数据,不通知列表刷新
	 */
	synchronized public void clearDatas() {
		if (mDatas != null) {
			mDatas.clear();
		}
	}
	/**
	 * 清除所有数据,自动通知列表刷新
	 */
	synchronized public void removeAllDatas() {
		clearDatas();
		notifyDataSetChanged();
	}
	/**
	 * 移除某个位置的数据,自动通知列表刷新
	 * 
	 * @param index
	 *            要移除的数据索引位置
	 */
	synchronized public void removeAt(int index) {
		if (mDatas != null && index >= 0 && index < mDatas.size()) {
			mDatas.remove(index);
			notifyDataSetChanged();
		}
	}
}
